/** 泛型接口(1) **/
/* interface ConfigFn {
  <T>(value: T):T
}

const getData:ConfigFn = function<T>(value: T):T{
  return value
}

getData<String>('张三')
// getData<String>(11) // 类型“number”的参数不能赋给类型“String”的参数。 */
/** 泛型接口(2) **/
/* interface ConfigFn<T>{
  (value: T):T
}
function getData<T>(value: T):T{
  return value
}
const myGetData:ConfigFn<String> = getData
myGetData('20') */
// myGetData(20) // 类型“number”的参数不能赋给类型“String”的参数


/** 把类作为参数来约束数据传入的类型 **/
/* class User {
  username: string | undefined
  password: string | undefined
}

class MysqlDb {
  add(user: User): boolean {
    console.log(user)
    return true
  }
}
const u = new User()
u.username = '吴超'
u.password = '123456'
const Db = new MysqlDb()
Db.add(u) */

/** 操作数据库的泛型类 **/
/* 
class MysqlDb<T> {
  add(info: T): boolean {
    console.log(info)
    return true
  }
}

// 想给User表增加数据
// 1、定义一个User类 和 数据库进行映射

class User {
  username: string | undefined
  password: string | undefined
}
const u = new User()
u.username = '张三'
u.password = '123456'
const Db = new MysqlDb<User>()
Db.add(u)
 */

/** 2、定义一个ArticleCate类 和 数据库进行映射 **/
// 操作数据的泛型类
class MysqlDb <T> {
  add(info:T):boolean {
    console.log(info)
    return true
  }
}
class ArticleCate {
  title: string | undefined
  desc: string | undefined
  status?: number | undefined
  constructor(params: {
    title: string | undefined
    desc: string | undefined
    status?: number | undefined
  }) {
    this.title = params.title
    this.desc = params.desc
    this.status = params.status
  }
}

const a = new ArticleCate({
  title: '分类',
  desc: '11',
  status: 0
})

/** 类当做参数的泛型类 **/
let Db = new MysqlDb<ArticleCate>()
Db.add(a)